home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / cathelp.i < prev    next >
Text File  |  1997-10-26  |  16KB  |  493 lines

  1. IMPLEMENTATION MODULE CatHelp;
  2.  
  3. FROM SYSTEM     IMPORT ADDRESS, ADR, CADR, TSIZE;
  4.  
  5. (* MM2 Module *)
  6. IMPORT Lists;
  7. FROM Storage    IMPORT ALLOCATE, DEALLOCATE;
  8. IMPORT GrafBase;
  9. IMPORT FileNames;
  10.  
  11. (* CAT Module *)
  12. IMPORT ListDl;
  13. IMPORT CatTypes;
  14. IMPORT ListHelp;
  15. IMPORT MausTauschrsc;
  16. IMPORT MTE;
  17. IMPORT CatGlobal;
  18. IMPORT CatFiles;
  19. IMPORT dataSys;
  20. IMPORT Varnames;
  21. IMPORT ConfVars;
  22. IMPORT Protokoll;
  23.  
  24. FROM Void IMPORT v;
  25.  
  26. (* MagicLib *)
  27. IMPORT MagicAES, MagicStrings, MagicConvert;
  28. IMPORT mtAppl;
  29. IMPORT mtDials;
  30. IMPORT mtTextfiles;
  31. IMPORT mtUtils;
  32.  
  33. TYPE    tHelpKeys = ARRAY [general..iofilter] OF ARRAY [0..39] OF CHAR;
  34.  
  35. CONST   cHelpFile = 'cat.hlp';
  36.         cHelpIdx  = 'cathelp.idx';
  37.         cHelpCode = '#(&)';
  38.         cHelpTable= tHelpKeys{'#(&)CAT',
  39.                               '#(&)CATINFO',
  40.                               '#(&)EDITOR',
  41.                               '#(&)ANZEIGE',
  42.                               '#(&)MESSAGES',
  43.                               '#(&)STICHWORT',
  44.                               '#(&)BŽUME',
  45.                               '#(&)FORMATE',
  46.                               '#(&)KONFIG',
  47.                               '#(&)OPTIONS',
  48.                               '#(&)TAUSCH',
  49.                               '#(&)LISTCONF',
  50.                               '#(&)SEARCHDIAL',
  51.                               '#(&)SMALLSEARCH',
  52.                               '#(&)FILTER',
  53.                               '#(&)GROUPLIST',
  54.                               '#(&)GROUPREAD',
  55.                               '#(&)GROUPWRITE',
  56.                               '#(&)GROUPUSER',
  57.                               '#(&)INFOLOAD',
  58.                               '#(&)INFOCHANGE',
  59.                               '#(&)MAXIMALSIZE',
  60.                               '#(&)SELECTGROUP',
  61.                               '#(&)REGISTER',
  62.                               '#(&)WIEDERVORLAGE',
  63.                               '#(&)TEXTSEARCH',
  64.                               '#(&)TEXTREPLACE',
  65.                               '#(&)CHANGEMSG',
  66.                               '#(&)ITKHELP',
  67.                               '#(&)CONFIGINFILE',
  68.                               '#(&)CONFIGEDITOR',
  69.                               '#(&)IOFILTER'};
  70.     cGuideHelpTable= tHelpKeys{
  71.                               'CAT - Das MausTausch-FrontEnd',
  72.                               'Shareware',
  73.                               'Der Editor',
  74.                               'Die Nachrichtenanzeige',
  75.                               'Kommentar ”ffnen',
  76.                               'Die Stichwortliste',
  77.                               'Die Baumanzeige',
  78.                               'Formate',
  79.                               'Konfiguration',
  80.                               'Allgemein',
  81.                               'Tauschoptionen',
  82.                               'Stichwortliste',
  83.                               'Der grože (kompliziertere) Suchdialog',
  84.                               'Der kleine (einfachere) Suchdialog',
  85.                               'Block filtern',
  86.                               'Gruppen',
  87.                               'Gruppen lesen',
  88.                               'Neue ”ffentliche...',
  89.                               'User an-/abstellen',
  90.                               'Mausinfo laden',
  91.                               'Infodateien',
  92.                               'Maximalgr”že berschritten!',
  93.                               'Gruppen ausw„hlen',
  94.                               'Shareware',
  95.                               'Wiedervorlage',
  96.                               'Textsuche...',
  97.                               'Text ersetzen',
  98.                               'Kommentar ”ffnen',
  99.                               'MausTausch-Kommandos',
  100.                               'Infile konfigurieren',
  101.                               'Editor',
  102.                               'I/O-Filter'};
  103.         cHelpMagic          = 43415448H; (* 'CATH' *)
  104.         cHelpVersion        = 0100H;
  105.         cHelpVersionMagic   = 020AH;
  106.  
  107. TYPE    tHelpIdx    = RECORD
  108.                         helpSize    : LONGCARD;
  109.                         helpOffset  : ARRAY [general..iofilter] OF LONGCARD;
  110.                       END;
  111.                       
  112.         tHelpInfo   = RECORD
  113.                         l           : Lists.List;
  114.                       END;
  115.                       
  116.         tHelpPtr    = POINTER TO tHelpInfo;
  117.  
  118. PROCEDURE buildIdx (REF path: ARRAY OF CHAR; size: LONGCARD; 
  119.                     f : mtTextfiles.TEXTFILE;
  120.                     VAR helpIdx: tHelpIdx): BOOLEAN;
  121.   VAR helpName        : CatTypes.String255;
  122.       skipString      : CatTypes.String127;
  123.       helpKey         : CatTypes.String127;
  124.       str             : CatTypes.Str127Ptr;
  125.       i               : tHelp;
  126.       found           : BOOLEAN;
  127.       header          : dataSys.FileHeaderType;
  128.       fi              : INTEGER;
  129. BEGIN
  130.   helpIdx.helpSize := size;
  131.   FOR i := general TO iofilter DO
  132.     helpIdx.helpOffset[i] := $FFFFFFFF;
  133.   END;
  134.   (* Jetzt alle Zeilen nach dem Key durchsuchen *)
  135.   LOOP
  136.     (* Zeilen bis zum Anfang des Helptextes berspringen *)
  137.     mtTextfiles.ReadLine(f, skipString);
  138.     IF mtTextfiles.EndofText (f) THEN EXIT END;
  139.     found := FALSE;
  140.     IF MagicStrings.Pos (cHelpCode, skipString, 0, FALSE) = 0
  141.     THEN
  142.       i := general;
  143.       LOOP
  144.         IF found THEN EXIT END;
  145.         IF MagicStrings.Pos (cHelpTable[i], skipString, 0, FALSE) < LENGTH (skipString)
  146.         THEN 
  147.           (* Gefunden. In der n„chsten Zeile geht es los *)
  148.           mtTextfiles.ReadLn (f);
  149.           (* Offset merken *)
  150.           helpIdx.helpOffset[i] := mtTextfiles.Textpos (f);
  151.           found := TRUE;
  152.         ELSE
  153.           IF i < MAX (tHelp)
  154.           THEN 
  155.             INC (i);
  156.           ELSE 
  157.             EXIT
  158.           END;
  159.         END;
  160.       END;
  161.     END;
  162.     IF ~found
  163.     THEN
  164.       mtTextfiles.ReadLn (f);
  165.     END;
  166.     IF mtTextfiles.EndofText (f) THEN EXIT END;
  167.   END;
  168.   mtTextfiles.Reset (f);
  169.   (* Jetzt den Hilfeindex schreiben *)
  170.   fi := CatFiles.CreateFile (path, cHelpIdx);
  171.   IF fi < 0 
  172.   THEN 
  173.     RETURN FALSE
  174.   END;
  175.   (* Fileheader aufbauen *)
  176.   header := dataSys.FileHeaderType {cHelpMagic, cHelpVersion, cHelpVersionMagic};
  177.   CatFiles.WriteMuch (dataSys.dbHeaderLength, fi, ADR(header));
  178.   CatFiles.WriteMuch (TSIZE (tHelpIdx), fi, ADR(helpIdx));
  179.   CatFiles.CloseFile (fi);
  180.   Protokoll.SendPathUpdate (path);
  181.   RETURN TRUE;
  182. END buildIdx;
  183.  
  184. PROCEDURE readHelp (VAR text : Lists.List; which: tHelp): BOOLEAN;
  185.   VAR helpName        : CatTypes.String255;
  186.       skipString      : CatTypes.String127;
  187.       helpKey         : CatTypes.String127;
  188.       str             : CatTypes.Str127Ptr;
  189.       f               : mtTextfiles.TEXTFILE;
  190.       header          : dataSys.FileHeaderType;
  191.       fi              : INTEGER;
  192.       helpSize        : LONGCARD;
  193.       helpIdx         : tHelpIdx;
  194.       path            : CatTypes.String255;
  195.       name            : CatTypes.nameStrType;
  196.       succ            : BOOLEAN;
  197. BEGIN
  198.   (*  Lies Hilfe-Datei ein.
  199.    *)
  200.   CatGlobal.ApplPath (helpName);
  201.   MagicStrings.Append (cHelpFile, helpName);
  202.   mtAppl.MouseBusy();
  203.   IF ~mtTextfiles.OpenTextfile (helpName, mtTextfiles.READ, 8192, f)
  204.   THEN
  205.     MagicStrings.Assign (cHelpFile, helpName);
  206.     MagicAES.ShelFind (helpName);
  207.     IF ~mtTextfiles.OpenTextfile (helpName, mtTextfiles.READ, 8192, f)
  208.     THEN
  209.       mtAppl.MouseArrow();
  210.       MTE.InfoAlert (MTE.noFile1, cHelpFile, MTE.noFile4);
  211.       RETURN FALSE;
  212.     END;
  213.   END;
  214.   
  215.   (* Gr”že der Hilfedatei feststellen *)
  216.   helpSize := CatFiles.FileSize (helpName, v.bool);
  217.   (* Jetzt nachsehen, ob wir auch eine Indexdatei haben. Wenn nein, 
  218.    * dann wird die jetzt aufgebaut
  219.    *)
  220.   FileNames.SplitPath (helpName, path, name);
  221.   fi := CatFiles.OpenFile (path, cHelpIdx, CatFiles.readFile);
  222.   IF fi < 0
  223.   THEN
  224.     (* Kein Index vorhanden, also aufbauen *)
  225.     succ := buildIdx (path, helpSize, f, helpIdx);
  226.   ELSE
  227.     (* Erstmal Header lesen und prfen *)
  228.     CatFiles.ReadMuch (dataSys.dbHeaderLength, fi, ADR(header));
  229.     IF (header.CatMagic # cHelpMagic) OR
  230.        (header.Version  # cHelpVersion) OR 
  231.        (header.VersionMagic # cHelpVersionMagic)
  232.     THEN
  233.       (* Index ist ungltig, neu aufbauen *)
  234.       CatFiles.CloseFile (fi);
  235.       succ := buildIdx (path, helpSize, f, helpIdx);
  236.     ELSE
  237.       CatFiles.ReadMuch (TSIZE (tHelpIdx), fi, ADR(helpIdx));
  238.       IF CatFiles.FileError < 0 
  239.       THEN 
  240.         CatFiles.ErrorAlert (CatFiles.FileError);
  241.         CatFiles.CloseFile (fi);
  242.         succ := buildIdx (path, helpSize, f, helpIdx);
  243.       ELSIF helpIdx.helpSize # helpSize
  244.       THEN
  245.         (* Index veraltet, neu aufbauen *)
  246.         CatFiles.CloseFile (fi);
  247.         succ := buildIdx (path, helpSize, f, helpIdx);
  248.       ELSE
  249.         CatFiles.CloseFile (fi);
  250.         succ := TRUE;
  251.       END;
  252.     END;
  253.   END;
  254.   (* Jetzt haben wir einen gltigen Index, nun mssen wir nur noch den 
  255.    * Schlssel suchen
  256.    *)
  257.   IF succ & (helpIdx.helpOffset[which] < helpIdx.helpSize)
  258.   THEN
  259.     (* Auf richtige Position setzen *)
  260.     mtTextfiles.SetTextpos (f, helpIdx.helpOffset[which]);
  261.   ELSE
  262.     (* Schade, Schlssel kann nicht stimmen, also doch einfach suchen *)
  263.   
  264.     (* Schlsselwort fr Suche bestimmen *)
  265.     MagicStrings.Assign (cHelpTable[which], helpKey);
  266.     (* Jetzt alle Zeilen nach dem Key durchsuchen *)
  267.     LOOP
  268.       (* Zeilen bis zum Anfang des Helptextes berspringen *)
  269.       mtTextfiles.ReadLine(f, skipString);
  270.       IF mtTextfiles.EndofText (f) THEN EXIT END;
  271.       IF MagicStrings.Pos (helpKey, skipString, 0, FALSE) < LENGTH (skipString)
  272.       THEN 
  273.         (* Gefunden. In der n„chsten Zeile geht es los *)
  274.         mtTextfiles.ReadLn (f);
  275.         EXIT 
  276.       END;
  277.       mtTextfiles.ReadLn (f);
  278.       IF mtTextfiles.EndofText (f) THEN EXIT END;
  279.     END;
  280.   END;
  281.   
  282.   MagicStrings.Assign (cHelpCode, helpKey);
  283.   
  284.   Lists.CreateList (text, v.bool);
  285.   IF v.bool THEN       
  286.     mtAppl.MouseArrow();
  287.     MTE.noMemAlert (); 
  288.     RETURN FALSE 
  289.   END;
  290.   LOOP
  291.     mtTextfiles.ReadLine(f, skipString);
  292.     IF MagicStrings.Pos (helpKey, skipString, 0, FALSE) < LENGTH (skipString)
  293.     THEN 
  294.       (* Gefunden. Hilfetext ist nun zu Ende *)
  295.       EXIT 
  296.     END;
  297.     NEW (str);
  298.     IF str = NIL THEN MTE.noMemAlert (); EXIT END;
  299.     MagicStrings.Assign (skipString, str^);
  300.     Lists.AppendEntry (text, str, v.bool);
  301.     IF v.bool THEN MTE.noMemAlert (); DISPOSE (str); EXIT END;
  302.     IF mtTextfiles.EndofText (f) THEN EXIT END;
  303.     mtTextfiles.ReadLn (f);
  304.     IF mtTextfiles.EndofText (f) THEN EXIT END;
  305.   END;
  306.    
  307.   mtTextfiles.CloseTextfile (f);
  308.   mtAppl.MouseArrow();
  309.   RETURN TRUE;
  310. END readHelp;
  311.  
  312. PROCEDURE lineToStr (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
  313.   VAR inf : CatTypes.Str127Ptr;
  314. BEGIN
  315.   inf := CatTypes.Str127Ptr (entry);
  316.   IF inf = NIL THEN RETURN END;
  317.   MagicStrings.Assign (inf^, str);
  318. END lineToStr;
  319.  
  320. PROCEDURE selEntry (entry, env: ADDRESS; line : INTEGER): BOOLEAN;
  321. BEGIN
  322.   RETURN FALSE
  323. END selEntry;
  324.  
  325. PROCEDURE isSelected (entry, env : ADDRESS) : BOOLEAN;
  326. BEGIN
  327.   RETURN FALSE;
  328. END isSelected;
  329.  
  330. PROCEDURE isEnabled (entry, env : ADDRESS) : BOOLEAN;
  331. BEGIN
  332.   RETURN TRUE
  333. END isEnabled;
  334.  
  335. PROCEDURE countEntries ( l : ADDRESS; VAR ll: LONGINT; VAR ww: INTEGER);
  336.  VAR lp : POINTER TO Lists.List;
  337. BEGIN
  338.  lp := l;
  339.  ww := 0;
  340.  ll := VAL (LONGINT, Lists.NoOfEntries (lp^));
  341. END countEntries;
  342.  
  343. PROCEDURE DeleteSimpleList (VAR l: Lists.List; killCarrier: BOOLEAN);
  344.  
  345. VAR   entry: ADDRESS;
  346.  
  347. BEGIN
  348.   Lists.ResetList (l);
  349.   entry := Lists.PrevEntry (l);
  350.   WHILE entry # NIL DO
  351.     Lists.RemoveEntry (l, v.bool);
  352.     DEALLOCATE (entry, 0L);
  353.     entry := Lists.CurrentEntry (l);
  354.   END;
  355.   IF killCarrier THEN Lists.DeleteList (l, v.bool) END;
  356. END DeleteSimpleList;
  357.  
  358. VAR  tr     : mtUtils.tObjcTree;
  359.  
  360. PROCEDURE drawHelpEntry (entry, env : ADDRESS; x, y : INTEGER;
  361.                          offset : INTEGER; clip   : GrafBase.Rectangle);
  362.  
  363.   CONST spaceString = "          ";
  364.   BEGIN
  365.     tr^[0].obX := x;
  366.     tr^[0].obY := y;
  367.     IF entry # NIL
  368.     THEN
  369.       (* Jetzt hier den String fr den Gruppennamen zusammenbauen *)
  370.       mtUtils.SetObjcStringAdr (tr, 0, ADDRESS(entry));
  371.     ELSE
  372.       mtUtils.SetObjcStringAdr (tr, 0, CADR(spaceString));
  373.     END;
  374.     MagicAES.ObjcDraw (tr, 0, 8, clip);
  375.   END drawHelpEntry;
  376.  
  377. PROCEDURE setAndGetHelpValues (tree: ADDRESS; private: ADDRESS; set: BOOLEAN; exitBut: INTEGER);
  378.   VAR l : tHelpPtr;
  379. BEGIN
  380.   IF ~set
  381.   THEN
  382.     l := private;
  383.     DeleteSimpleList (l^.l, TRUE);
  384.     DISPOSE (l);
  385.    END;
  386. END setAndGetHelpValues;
  387.  
  388. PROCEDURE internalDoHelp (topic: tHelp; doReadHelp: BOOLEAN; VAR externalHelp: Lists.List);
  389.   VAR l : tHelpPtr;
  390.       exit : INTEGER;
  391.       specials : ARRAY [0..0] OF ListDl.specialButHdler;
  392.       helpBox  : ADDRESS;
  393.       maxLength: INTEGER;
  394.       r        : GrafBase.Rectangle;
  395.       dialHandler: ListDl.ldHandler;
  396. BEGIN
  397.   NEW (l);
  398.   IF l = NIL
  399.   THEN
  400.     MTE.noMemAlert();
  401.     RETURN
  402.   END;
  403.   
  404.   helpBox := MausTauschrsc.TreeAddr^[MausTauschrsc.helpbox];
  405.   specials[0].objc := -99;
  406.  
  407.   IF doReadHelp & ~readHelp (l^.l, topic)
  408.   THEN 
  409.     RETURN 
  410.   END;
  411.   IF ~doReadHelp
  412.   THEN
  413.     l^.l := externalHelp;
  414.   END;
  415.   
  416.   (* Jetzt das Object zusammenbauen *)
  417.   mtUtils.CalcArea (helpBox, MausTauschrsc.hhelpbox, r);
  418.   maxLength := r.w DIV mtAppl.CharWidth;
  419.  
  420.   (* Objectadresse holen *)
  421.   tr := MausTauschrsc.TreeAddr^[MausTauschrsc.listtxt];
  422.   tr^[0].obSpec.TedPtr^.teTxtlen := maxLength;
  423.   tr^[0].obWidth := maxLength*mtAppl.CharWidth;
  424.   mtUtils.SetState (tr, 0, MagicAES.SELECTED, FALSE);
  425.   mtUtils.SetState (tr, 0, MagicAES.DISABLED, FALSE);
  426.  
  427.   (* WindowDialog vorbereiten *)
  428.   ListDl.BuildLdHandler (ADR(l^.l), 
  429.                          ListHelp.resetList,
  430.                          ListHelp.nextEntry,
  431.                          ListHelp.prevEntry,
  432.                          countEntries, 
  433.                          isEnabled, selEntry,
  434.                          lineToStr, isSelected, 
  435.                          drawHelpEntry,
  436.                          0, mtAppl.CharHeight, 
  437.                          0, 0,
  438.                          dialHandler);
  439.  
  440.   (* ListWinDialog ”ffnen *)
  441.   IF ListDl.WinListDial (helpBox, ListDl.ldElemSet{ListDl.ldArrows, ListDl.ldModal},
  442.                        dialHandler,
  443.                        MausTauschrsc.hhelpbox,
  444.                        MausTauschrsc.hhelpback,
  445.                        MausTauschrsc.hok,
  446.                        -1,
  447.                        l, -1,
  448.                        -1,
  449.                        ListDl.dummyInLoop,
  450.                        specials,
  451.                        0,
  452.                        ListDl.dummyCheckExit,
  453.                        setAndGetHelpValues,
  454.                        setAndGetHelpValues,
  455.                        v.a)
  456.   THEN
  457.   END;
  458. END internalDoHelp;
  459.  
  460. PROCEDURE DoHelp (topic: tHelp);
  461.   VAR externalHelp : BOOLEAN;
  462.       helpText     : CatTypes.String255;
  463.       helpTopic    : CatTypes.String255;
  464.       voidList     : Lists.List;
  465. BEGIN
  466.   (* Hilfe an Hilfesystem schicken *)
  467.   ConfVars.GetConfDefBool (cExternHelp, externalHelp, FALSE);
  468.   IF externalHelp
  469.   THEN
  470.     ConfVars.GetConfDefStr (cHyperText, helpText, "cat.hyp");
  471.     MagicStrings.Assign (cGuideHelpTable[topic], helpTopic);
  472.     (* SendExtendedHelp liefert FALSE zurck, falls das Hilfesystem
  473.      * ST-Guide nicht gefunden wurde
  474.      *)
  475.     externalHelp := Protokoll.SendExtendedHelp (helpTopic, helpText);
  476.   END;
  477.   (* Wenn der externe Aufruf nicht geklappt hat, dann wird hier
  478.    * noch die interne Hilfe aufgerufen 
  479.    *)
  480.   IF ~externalHelp
  481.   THEN
  482.     internalDoHelp (topic, TRUE, voidList);
  483.   END;
  484. END DoHelp;
  485.  
  486. PROCEDURE DoExternalHelp (VAR helpList: Lists.List);
  487. BEGIN
  488.   internalDoHelp (general, FALSE, helpList);
  489. END DoExternalHelp;
  490.  
  491.  
  492. END CatHelp.
  493.